package com.yhally.seata.order.tcc;

import com.yhally.seata.order.domain.Order;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

/**
 * TCC 事务模型
 * @LocalTCC 注解表示开启TCC事务
 * @author wangyu
 * @version 1.0
 * @date 2022/5/8 16:26
 */
@LocalTCC
public interface OrderTccAction {

    /**
     * <p>描述: 一阶段try方法，用于资源的预留，在此阶段可以进行库存冻结。
     *          @TwoPhaseBusinessAction 注解标记这是个TCC接口，同时指定commitMethod，rollbackMethod的名称。
     *          BusinessActionContext 是TCC事务中的上下文对象。
     *          @BusinessActionContextParameter 注解的参数数据会被存入BusinessActionContext，参数会在上下文中传播 ，
     *          即能通过BusinessActionContext对象在commit方法及rollback方法中取到该参数值。
     * <p>开发者: wangyu
     * <p>时间: 2022/5/8 16:47
     *
     * @param businessActionContext 
     * @param order 
     * @return boolean
     */
    @TwoPhaseBusinessAction(name = "orderAction",commitMethod = "commit",rollbackMethod = "rollback")
    boolean creatOrder(BusinessActionContext businessActionContext,@BusinessActionContextParameter(paramName = "order")Order order);

    /**
     * <p>描述: 二阶段提交
     * <p>开发者: wangyu
     * <p>时间: 2022/5/8 16:49
     *
     * @param businessActionContext
     * @return boolean 返回false会不断重试
     */
    boolean commit(BusinessActionContext businessActionContext);

    /**
     * <p>描述: 二阶段回滚
     * <p>开发者: wangyu
     * <p>时间: 2022/5/8 16:49
     *
     * @param businessActionContext
     * @return boolean 返回false会不断重试
     */
    boolean rollback(BusinessActionContext businessActionContext);
}
